Remix でレスポンスを stream で返す
React の Streaming ではない、Chat AI のような生成に時間がかかるレスポンスを逐次的に返したい
ReadableStream をレスポンスする
Node から Response を返すときに global.Response を使う
Node の http.ServerResponse ではなく ブラウザ互換性ある方
new Response(aReadableStream, option)
返すだけならこれでよいはず
stream 周り
ブラウザ互換性あるのは ReadableStream / WritableStream
変換
Readable 返したい
Readable → ReadableStream
import { createReadableStreamFromReadable } from "@remix-run/node"; を使う
AsyncGenerator 返したい
AsyncGenrator → Readable → ReadableStream
Readable.from 使う
なのでクライアントサイドでやるなら polyfill 要る
これで ReadableStream.from(asyncgenerator) が使える
SSE 返す
remix-util 使う
eventStream & useEventSource がそれ
例
---.icon
あれもう @remix-run/node に Response ない
すごい名前だ
stream 使ったアプリケーションでひたすらハマる